/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NodeManager;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;

/**
 *
 * @author Sean
 */
public class Node {

    private File _location;
    public String NodeName;

    public Node(String NodeName, File location) throws Exception {

        if (location == null) {
            throw new IllegalArgumentException("The location cannot be null.");
        }
        if (!location.exists()) {
            throw new Exception(location + " cannot be found.");
        }
        SetLocation(location);

        this.NodeName = NodeName;

    }

    public File GetLocation(){
        return _location;
    }
    private void SetLocation(File location) throws Exception {
        if (!location.isDirectory()) {
            throw new IllegalArgumentException("Parameter - location - must be a directory.");
        }

        this._location = location;
    }

    public Vector<File> GetAllFiles() throws Exception {

        VerifyLocation();

        Vector<File> AllFiles = new Vector<File>();

        // iterate through each file in _Location
        for (File file : _location.listFiles()) {
            AllFiles.add(file);
        }

        return AllFiles;

    }

    private void VerifyLocation() throws Exception {
        if (_location == null) {
            throw new NullPointerException("Location is null.");
        }

        // Ensure _location exists
        if (!_location.exists()) {
            throw new Exception(_location + " cannot be found.");
        }
    }

    public int GetFileCount(){
        return _location.listFiles().length;
    }

    // TODO need to use java.nio.file for this:
    // http://java.sun.com/docs/books/tutorial/essential/io/copy.html
    void AddFile(File fromFile)
            throws IOException {

        File toFile = new File(_location.getPath() + File.separator + fromFile.getName());

        if (!fromFile.exists()) {
            throw new IOException("FileCopy: " + "no such source file: "
                    + fromFile.getName());
        }
        if (!fromFile.isFile()) {
            throw new IOException("FileCopy: " + "can't copy directory: "
                    + fromFile.getName());
        }
        if (!fromFile.canRead()) {
            throw new IOException("FileCopy: " + "source file is unreadable: "
                    + fromFile.getName());
        }

        if (toFile.isDirectory()) {
            toFile = new File(toFile, fromFile.getName());
        }

        if (toFile.exists()) {
            // TODO - what happens if the file exists?
//      if (!toFile.canWrite())
//        throw new IOException("FileCopy: "
//            + "destination file is unwriteable: " + toFileName);
//      System.out.print("Overwrite existing file " + toFile.getName()
//          + "? (Y/N): ");
//      System.out.flush();
//      BufferedReader in = new BufferedReader(new InputStreamReader(
//          System.in));
//      String response = in.readLine();
//      if (!response.equals("Y") && !response.equals("y"))
//        throw new IOException("FileCopy: "
//            + "existing file was not overwritten.");
        } else {
            String parent = toFile.getParent();
            if (parent == null) {
                parent = System.getProperty("user.dir");
            }
            File dir = new File(parent);
            if (!dir.exists()) {
                throw new IOException("FileCopy: "
                        + "destination directory doesn't exist: " + parent);
            }
            if (dir.isFile()) {
                throw new IOException("FileCopy: "
                        + "destination is not a directory: " + parent);
            }
            if (!dir.canWrite()) {
                throw new IOException("FileCopy: "
                        + "destination directory is unwriteable: " + parent);
            }
        }

        FileInputStream from = null;
        FileOutputStream to = null;
        try {
            from = new FileInputStream(fromFile);
            to = new FileOutputStream(toFile);
            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = from.read(buffer)) != -1) {
                to.write(buffer, 0, bytesRead); // write
            }
        } finally {
            if (from != null) {
                try {
                    from.close();
                } catch (IOException e) {
                }
            }
            if (to != null) {
                try {
                    to.close();
                } catch (IOException e) {
                }
            }
        }
    }
}
